package day20170410;


import java.util.Scanner;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import utils.ArrayUtil;

public class ArraysCRUDTest {
	
	private String[] class1704 = {"贾梦菊","靳志辉","何小强","罗智壕","张嘉源"};
	
	Scanner scanner = null;
	
	/**
	 * 在方法执行之前执行
	 * @throws Exception
	 */
	@Before
	public void before() throws Exception {
		scanner = new Scanner(System.in);
	}
	
	/**
	 * 在方法执行之后执行
	 * @throws Exception
	 */
	@After
	public void after() throws Exception {
		scanner.close();
	}
	
	/**
	 * 删除方法测试
	 * @throws Exception
	 */
	@Test
	public void deleteStudentTest() throws Exception {
		String stuName = "罗智壕";
		deleteStudent(class1704, stuName);
		ArrayUtil.arrayPrint(class1704);
	}
	
	/**
	 * 修改方法测试
	 * @throws Exception
	 */
	@Test
	public void changeStudentTest() throws Exception {
		String oldStuName = "罗智壕";
		String newStuName = "奥巴马";
		changeStudent(class1704, oldStuName, newStuName);
	}
	
	/**
	 * 查询方法测试
	 * @throws Exception
	 */
	@Test
	public void RetrieveTest() throws Exception {
		ArrayUtil.arrayPrint(class1704);
	}
	
	/**
	 * 增加方法测试
	 * @throws Exception
	 */
	@Test
	public void studentCRUDTest() throws Exception {
		System.out.println("输入你要增加的学生：");
		String stu = scanner.nextLine();
		int result = findStudentByName(stu);
		
		//返回的boolean类型代表学生存在
		if(result >= 0){
			System.out.println("你输入的学生已经存在...下标为：" + result);
		}else{
			//学生不存在，则可以增加
			add(stu);
			//打印工具类
			ArrayUtil.arrayPrint(class1704);
		}
		
	}
	
	/**
	 * 判断学生是否存在
	 * @param arrays	需要判断的数组
	 * @param stu		需要判断的元素
	 * @return			返回判断结果
	 */
	public int findStudentByName(String stu){
		//定义一个下标如果学生存在返回对应的下标，不存在则是-1
		int result = -1;
		
		for(int i=0; i<class1704.length; i++){
			if(stu.equals(class1704[i])){
				//返回学生存在的下标
				return i;
			}
		}	
		
		return result;
	}
	
	/**
	 * 增加方法
	 * @param stu	需要增加的元素
	 * @return		返回新的数组
	 */
	public void add(String stu){
		//定义一个新数组，长度为原来数组的长度+1
		String [] str = new String[class1704.length+1];
		
		for(int i=0; i<class1704.length; i++){
			//把旧数组的值赋值给新数组
			str[i] = class1704[i];
		}
		
		//加入学生到新数组最后一个
		str[str.length-1] = stu;
		//新数组赋值给原来数组
		class1704 = str;
	}
	
	/**
	 * 删除方法
	 * @param arrays	需要删除的数组
	 * @param stuName	需要删除的学生
	 */
	public void deleteStudent(String[] arrays,String stuName){
		//判断是否存在要删除的学生，存在返回下标，不存在返回-1
		int index = findStudentByName(stuName);
		String[] newArrays = new String[class1704.length-1];
		
		if(index == -1){
			System.out.println("你输入的学生" + stuName + "不存在...");
		}else{
			for(int i=0; i<arrays.length; i++){
				String value = arrays[i];
				if(i < index){
					//旧数组的值赋值到新数组
					newArrays[i] = value;
				}else if(i == index){
					//结束本次循环，继续下次循环
					continue;
				}else{
					//后面一个元素往前面移动
					newArrays[i-1] = value;
				}
			}
		}
		
		//重点，把class1704数组的指针指向新数组
		class1704 = newArrays;
	}
	
	/**
	 * 修改学生
	 * @param arrays		需要修改的数组
	 * @param oldStuName	需要修改的学生名字
	 * @param newStuName	需要修改的新名字
	 */
	public void changeStudent(String[] arrays,String oldStuName,String newStuName){
		//判断完这个学生，通过返回的下标进行修改
		int index = findStudentByName(oldStuName);
		
		if(index == -1){
			System.out.println("你输入的" + oldStuName + "学生不存在...");
		}else{
			arrays[index] = newStuName;
			ArrayUtil.arrayPrint(class1704);
		}
		
	}
}
